package com.qf.util;

import java.lang.reflect.Field;

/**
 * created by 赵文韬 on 2022/6/19 17:22
 */
public class BeanUtils {

    /**
     * 根据一个对象构造另一个对象，相同成员名的成员值复制过去。
     * @param source 数据的来源的对象
     * @param clazz 指定返回类型的对象
     */
    public static <T> T copy(Object source,Class<T> clazz){
        T target = null;
        try {
            target = clazz.newInstance();
            copy(source,target);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return target;
    }

    /**
     * 这是两个对象拷贝成员的方法
     * @param source 数据的来源的对象
     * @param target 数据的写入的目标对象
     */
    public static void copy(Object source,Object target){
        Class<?> sourceClass=source.getClass();
        Class<?> targetClass=target.getClass();
        //拿到源对象的所有成员
        Field[] sourceFields=sourceClass.getDeclaredFields();
        for (int i = 0; i < sourceFields.length; i++) {
            //获取第i个成员
            Field field=sourceFields[i];
            //设置可见性
            field.setAccessible(true);
            //拿到成员的名字
            String name=field.getName();
            //拿同名的成员
            Field targetField=null;
            try {
                targetField=targetClass.getDeclaredField(name);
            } catch (NoSuchFieldException e) {
                continue;
            }
            //复制属性的值
            targetField.setAccessible(true);
            try {
                //设置target对象的targetField成员的值 为 source对象的field成员的值。
                targetField.set(target,field.get(source));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
}
